﻿#define   _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
#include <assert.h>
#include <string.h>

//（1）用assert判断指针, 检查这个指针是不是有效的空间

//int main()
//{
//	int a = 10;
//	int* p = &a;
//	//...
//	//...
//	p = NULL;//当不想使用的时候设置为空指针
//
//	//用assert来判断
//	assert(p != NULL);
//
//	return 0;
//}

//int main()
//{
//	int a = 0;
//
//	assert(a);//当这个表达式为假程序报错
//
//	return 0;
//}

//实现strlen函数
//size_t my_strlen(const char* s)//const修饰指针变量
//{
//	size_t count = 0;
//	//*s = "asd";被const修饰了之后强行修改指向的内容会报错
//	assert(s != NULL);
//
//	while (*s != '\0')
//	{
//		count++;
//		s++;
//	}
//	return count;
//}
//
//int main()
//{
//	char arr[] = "abcdefg";
//	size_t n = my_strlen(arr);//传递数组首元素的地址，传址调用
//
//	printf("%zd\n", n);
//
//	return 0;
//}

//size_t my_strlen(const char* s)//const修饰指针变量*s 里面的值不能改变，保护实参传递的内容
//{
//	//*s = 'w';被修饰之后修改指向内容的值会报错
//
//	//别人传递的指针有木有可能是空指针所以就要assert断言判断或if判断
//	assert(s != NULL);
//
//	char* pa = s;
//
//	while (*s != '\0')
//	{
//		s++;
//	}
//	return pa - s;
//}
//
//int main()
//{
//	char arr[] = "abcdefg";
//	size_t n = my_strlen(arr);//传递数组首元素的地址，传址调用
//
//	printf("%zd\n", n);
//
//	return 0;
//}

//代码举例：写⼀个函数，交换两个整型变量的值
//（1）错误举例

//void fufu(int x, int y)
//{
//	int z = 0;
//	z = x;
//	x = y;
//	y = z;
//
//}
//
//int main()
//{
//	int a = 0;
//	int b = 0;
//	scanf("%d %d", &a, &b);
//	//交换a和b的值
//
//	printf("交换前：a = %d b = %d\n", a, b);
//	fufu(a, b);
//	printf("交换后：a = %d b = %d\n", a, b);
//	return 0;
//}

//（2）正确举例
//void fufu(int* x, int* y)//传的整形地址，这里可以用整形指针接收
//{
//	//*x = a
//	//*y = b
//
//	int z = 0;
//	z = *x;
//	*x = *y;
//	*y = z;
//}
//
//int main()
//{
//	int a = 0;
//	int b = 0;
//	scanf("%d %d", &a, &b);
//	//交换a和b的值
//
//	printf("交换前：a = %d b = %d\n", a, b); 
//	fufu(&a, &b);//传值调用
//	printf("交换后：a = %d b = %d\n", a, b); 
//	return 0;
//}

//int main()
//{
//	char arr[10] = "0";
//	int sz = sizeof(arr);
//	printf("%d", sz);
//	return 0;
//}

//int main()
//{
//	char arr[10] = "0";
//
//	printf("%p\n", &arr[0]);
//	printf("%p\n", arr);
//
//	printf("%d\n", sizeof(arr));
//
//	return 0;
//}

//int main()
//{
//	int arr[10] = { 0 };
//	//（1）
//	printf("%p\n", &arr[0]);//int*类型
//	printf("%p\n", &arr[0] + 1);//跳过4个字节
//	//（2）
//	printf("%p\n", arr);//int*类型
//	printf("%p\n", arr + 1);//跳过4个字节
//	//（3）
//	printf("%p\n", &arr);//整个数组类型
//	printf("%p\n", &arr + 1);//跳过40个字节
//
//	return 0;
//}


//int main()
//{
//	int arr[10] = { 0 };
//	int n = sizeof(arr) / sizeof(arr[0]);
//	int* pa = arr;
//	//pa <==> arr 等价
//
//	int i = 0;
//	for (i = 0; i < n; i++)
//	{
//		//1.scanf("%d", &arr[i]);//数组方式
//		//2.scanf("%d", pa+i);//指针方式
//		scanf("%d", arr + i);//pa <==> arr 等价
//
//		
//	}
//	for (i = 0; i < n; i++)
//	{
//		//1.printf("%d ", arr[i);
//		//2.printf("%d ", *(pa + i) );
//		printf("%d ", *(arr + i));//pa <==> arr 等价
//
//	}
//	return 0;
//}

//int main()
//{
//	int arr[10] = { 0 };
//	int n = sizeof(arr) / sizeof(arr[0]);
//	int* pa = arr;
//	//pa <==> arr 等价
//
//	int i = 0;
//	for (i = 0; i < n; i++)
//	{
//		//1.scanf("%d", &arr[i]);
//		//2.scanf("%d",pa+i);
//		//3.scanf("%d", arr+i);
//		scanf("%d", &i[pa]);
//
//	}
//	for (i = 0; i < n; i++)
//	{
//		//1.printf("%d", arr[i]);
//		//2.printf("%d", *(pa+i));
//		//3.printf("%d", *(arr + i));
//		printf("%d ", i[pa]);
//
//	}
//	return 0;
//}

//void fufu(int arr[])
//{
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	printf("%d", sz);
//}
//int main()
//{
//	int arr[10] = { 0 };
//	fufu(arr);
//	return 0;
//}

void printF(int* arr,int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", *(arr + i));
	}
}

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	printF(arr,sz);
	return 0;
}
//*(arr + i),每次指向下个地址，找到里面的内容
//(arr + i),这个只是地址+i